home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d8 / pdriver5.arc / PKTALL.ASM < prev    next >
Assembly Source File  |  1989-12-17  |  5KB  |  235 lines

  1. ;  Russell Nelson, Clarkson University.  October 20, 1988
  2. ;  Copyright, 1988, 1989, Russell Nelson
  3.  
  4. ;   This program is free software; you can redistribute it and/or modify
  5. ;   it under the terms of the GNU General Public License as published by
  6. ;   the Free Software Foundation, version 1.
  7. ;
  8. ;   This program is distributed in the hope that it will be useful,
  9. ;   but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. ;   GNU General Public License for more details.
  12. ;
  13. ;   You should have received a copy of the GNU General Public License
  14. ;   along with this program; if not, write to the Free Software
  15. ;   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.  
  17. segmoffs    struc
  18. offs        dw    ?
  19. segm        dw    ?
  20. segmoffs    ends
  21.  
  22. HT    equ    09h
  23. CR    equ    0dh
  24. LF    equ    0ah
  25.  
  26. code    segment byte public
  27.     assume    cs:code, ds:code
  28.  
  29.     org    80h
  30. phd_dioa    label    byte
  31.  
  32.     org    100h
  33. start:
  34.     jmp    start_1
  35.  
  36. their_isr    dd    ?
  37. packet_int_no    db    ?,?
  38. handle        dw    ?
  39. packet_count    dw    0
  40. signature    db    'PKT DRVR',0
  41. signature_len    equ    $-signature
  42. no_signature_msg    db    "No packet driver at that address",'$'
  43. usage_msg    db    "usage: pktall <packet_int_no>",'$'
  44. waiting_msg    label    byte
  45.     db    "Now waiting for packets to be received.  The bell will ring when one is",CR,LF
  46.     db    "received.  Press any key to exit.",CR,LF,'$'
  47.  
  48. usage_error:
  49.     mov    dx,offset usage_msg
  50. error:
  51.     mov    ah,9
  52.     int    21h
  53.     int    20h
  54.  
  55. start_1:
  56.     mov    si,offset phd_dioa+1
  57.     cmp    byte ptr [si],CR    ;end of line?
  58.     je    usage_error
  59.  
  60.     mov    di,offset packet_int_no
  61.     call    get_number
  62.  
  63.     mov    ah,35h            ;get their packet interrupt.
  64.     mov    al,packet_int_no
  65.     int    21h
  66.     mov    their_isr.offs,bx
  67.     mov    their_isr.segm,es
  68.  
  69.     lea    di,3[bx]
  70.     mov    si,offset signature
  71.     mov    cx,signature_len
  72.     repe    cmpsb
  73.     jne    no_signature_err
  74.  
  75.     mov    ah,2            ;access all packets.
  76.     mov    al,1            ;Ethernet class.
  77.     mov    bx,-1            ;generic type.
  78.     mov    dl,0            ;generic number.
  79.     mov    cx,0            ;type length of zero.
  80.     push    cs            ;es:di -> our receiver.
  81.     pop    es
  82.     mov    di,offset our_recv
  83.     pushf
  84.     cli
  85.     call    their_isr
  86.     mov    handle,ax
  87.  
  88.     mov    dx,offset waiting_msg
  89.     mov    ah,9
  90.     int    21h
  91.  
  92. wait_for_key:
  93.     cmp    packet_count,0
  94.     je    no_packet
  95.     mov    packet_count,0
  96.     mov    al,7
  97.     mov    ah,0eh
  98.     int    10h
  99. no_packet:
  100.     mov    ah,1            ;check for any key.
  101.     int    16h
  102.     je    wait_for_key        ;no key -- keep waiting.
  103.  
  104.     mov    ah,0            ;fetch the key.
  105.     int    16h
  106.  
  107.     mov    ah,3
  108.     mov    bx,handle
  109.     pushf
  110.     cli
  111.     call    their_isr
  112.  
  113.     int    20h
  114.  
  115. no_signature_err:
  116.     mov    dx,offset no_signature_msg
  117.     mov    ah,9
  118.     int    21h
  119.     int    20h
  120.  
  121.  
  122. our_recv:
  123.     inc    cs:packet_count
  124.     or    ax,ax            ;first or second call?
  125.     jne    our_recv_1        ;second -- we ignore the packet
  126.     push    cs
  127.     pop    es
  128.     mov    di,offset our_buffer
  129. our_recv_1:
  130.     retf
  131.  
  132.  
  133.     public    get_number
  134. get_number:
  135.     mov    bp,10            ;we default to 10.
  136.     jmp    short get_number_0
  137.  
  138.     public    get_hex
  139. get_hex:
  140.     mov    bp,16
  141. ;get a hex number from [si], skipping leading blanks.
  142. ;return cy if there are no digits at all.
  143. ;return nc, bx:cx = number, and store cx at [di]
  144. get_number_0:
  145.     call    skip_blanks
  146.     call    get_digit        ;is there really a number here?
  147.     jc    get_number_3
  148.     or    al,al            ;Does the number begin with zero?
  149.     jne    get_number_4        ;no.
  150.     mov    bp,8            ;yes - they want octal.
  151. get_number_4:
  152.  
  153.     xor    cx,cx            ;get a hex number.
  154.     xor    bx,bx
  155. get_number_1:
  156.     lodsb
  157.     cmp    al,'x'            ;did they really want hex?
  158.     je    get_number_5        ;yes.
  159.     cmp    al,'X'            ;did they really want hex?
  160.     je    get_number_5        ;yes.
  161.     call    get_digit        ;convert a character into an int.
  162.     jc    get_number_2        ;not a digit (neither hex nor dec).
  163.     xor    ah,ah
  164.     cmp    ax,bp            ;larger than our base?
  165.     jae    get_number_2        ;yes.
  166.  
  167.     push    ax            ;save the new digit.
  168.  
  169.     mov    ax,bp            ;multiply the low word by ten.
  170.     mul    cx
  171.     mov    cx,ax            ;keep the low word.
  172.     push    dx            ;save the high word for later.
  173.     mov    ax,bp
  174.     mul    bx
  175.     mov    bx,ax            ;we keep only the low word (which is our high word)
  176.     pop    dx
  177.     add    bx,ax            ;add the high result from earlier.
  178.  
  179.     pop    ax            ;get the new digit back.
  180.     add    cx,ax            ;add the new digit in.
  181.     adc    bx,0
  182.     jmp    get_number_1
  183. get_number_5:
  184.     mov    bp,16            ;change the base to hex.
  185.     jmp    get_number_1
  186. get_number_2:
  187.     dec    si
  188.     mov    [di],cx            ;store the parsed number.
  189.     clc
  190.     ret
  191. get_number_3:
  192.     stc
  193.     ret
  194.  
  195.  
  196.     public    skip_blanks
  197. skip_blanks:
  198.     lodsb                ;skip blanks.
  199.     cmp    al,' '
  200.     je    skip_blanks
  201.     cmp    al,HT
  202.     je    skip_blanks
  203.     dec    si
  204.     ret
  205.  
  206.  
  207. get_digit:
  208. ;enter with al = character
  209. ;return nc, al=digit, or cy if not a digit.
  210.     cmp    al,'0'            ;decimal digit?
  211.     jb    get_digit_1        ;no.
  212.     cmp    al,'9'            ;. .?
  213.     ja    get_digit_2        ;no.
  214.     sub    al,'0'
  215.     clc
  216.     ret
  217. get_digit_2:
  218.     or    al,20h
  219.     cmp    al,'a'            ;hex digit?
  220.     jb    get_digit_1
  221.     cmp    al,'f'            ;hex digit?
  222.     ja    get_digit_1
  223.     sub    al,'a'-10
  224.     clc
  225.     ret
  226. get_digit_1:
  227.     stc
  228.     ret
  229.  
  230. our_buffer    label    byte
  231.  
  232. code    ends
  233.  
  234.     end    start
  235.